import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from "@nestjs/common";
import { AppModule } from './app.module';
import { ConfigService } from "@nestjs/config";
import { FormatResponseInterceptor } from "./format-response.interceptor";
import { InvokeRecordInterceptor } from "./invoke-record.interceptor";
import { CustomExceptionFilter } from './custom-exception.filter';
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
import { NestExpressApplication } from '@nestjs/platform-express';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  // 启用全局请求拦截器（实现请求成功的响应数据格式化）
  app.useGlobalInterceptors(new FormatResponseInterceptor());
  // 启用全局请求拦截器（实现记录用户信息，接口的调用信息）
  app.useGlobalInterceptors(new InvokeRecordInterceptor());
  // 全局启用请求失败时返回的数据格式
  app.useGlobalFilters(new CustomExceptionFilter());

  // 解决跨域问题
  app.enableCors();

  // 将uploads目录设置为静态文件目录，这样可以直接通过 url访问到，方便查看 (需要 NestFactory.create 创建时添加泛型 NestExpressApplication)
  app.useStaticAssets("uploads", { // 静态目录名
    prefix: "/uploads" // 指定访问该目录时的请求前缀
  })

  // 在项目中集成swagger
  const config = new DocumentBuilder()
    .setTitle("会议室预定系统")
    .setDescription("api 接口文档")
    .setVersion("1.0")
    .addBearerAuth({
      type: "http",
      description: "基于 jwt 的认证"
    })
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup("api-doc", app, document);

  const configService = app.get(ConfigService)
  await app.listen(configService.get("nest_server_port"));
}
bootstrap();
